﻿#ifndef THREADFILEIO_H
#define THREADFILEIO_H

#include <QTcpSocket>
#include "protocol.h"
#include <QCryptographicHash>
// #include "filewidget.h"

class ThreadFileIO: public QObject
{
    Q_OBJECT
public:
    ThreadFileIO(const QString &remoteFilePath, const QString &localFilePath,
                 const QString &IP, uint port,
                 uint threadType = ENUM_THREAD_TYPE_UPLOAD_FILE,
                 QObject *parent = nullptr);
    ~ThreadFileIO();
    // 服务器准备好上传文件，处理文件上传
    void handleUploadingFile(PDU *pdu);

    // 服务器已经完整接收到数据
    void handleUploadedFile(PDU *pdu);

    // 服务器准备好下载文件， 处理文件下载回复，发起开始下载请求
    void handleDownloadFileRespond(PDU* pdu);

    // 接收服务器传来的文件数据，以及进行MD5校验
    void handleDownloadFileSendRespond(PDU* pdu);

public slots:
    // 连接服务器
    void slot_connectToHost();

    // 发起文件上传请求
    void slot_uploadFileRequest();

    // 发起要下载文件请求
    void slot_downloadFileRequest();

    //接收数据
    void recv_Msg();

private:
    QString m_remoteFilePath;// 远程文件路径
    QString m_localFilePath;// 本地文件路径
    QString m_IP;// 服务器IP
    uint m_port;// 服务器端口

    double nextThreshold = 0.1;// 发送进度信号的阈值
    QFile* file = NULL;
    qint64 fileSize = 0;// 文件大小
    qint64 m_iRecved = 0;// 已经接收到的大小
    QCryptographicHash* fileHash = NULL;

    QTcpSocket *m_tcpsocket = NULL;

signals:
    // 文件上传状态
    void signal_UploadFileStatus(QString msg);

    // 文件下载状态
    void signal_DownloadFileStatus(QString msg);

    // 进度条 值
    void signal_setProgeressBarValue(qint64 hasSendSize);

    // 进度条最大值
    void signal_setProgeressBarMaxValue(qint64 totalSize);
};

#endif // THREADFILEIO_H
